package com.demo.alibaba.util;

/**
 * @author Jim Gong(gongjian_xm@163.com）
 * @since 2017.2.24
 */
public abstract class Organization {

    public enum Type {
        FACTORY(4, "厂家"), SUPPLIER(2, "供应商"), CSO(3, "营销组织"), SELLING(1, "终端"), ADMIN(0, "平台"), UNKNOWN(-1, "未知");

        private final int code;

        private final String description;

        Type(int code, String description) {
            this.code = code;
            this.description = description;
        }

        public int getCode() {
            return code;
        }

        public String getDescription() {
            return description;
        }

        public static Type of(int code) {
            for (Type type : Type.values()) {
                if (type.getCode() == code) {
                    return type;
                }
            }
            return UNKNOWN;
        }
    }

    public enum Element {
        /** 织机构类型 */
        TYPE(0x40, "type"),
        /** 组织机构的机构，用于描述企业或终端机构，比如：药店，制药厂。 */
        ORGANIZATION(0x1, "organization"),
        /** 组织机构部门，组织机构的下属部门，指代组织机构的结构。 */
        DEPARTMENT(0x10, "department"),
        /** 组织机构岗位，是企业自运营的组织机构元素，其主要用于企业或单体机构内部的基于管理的不同分工，比如：店长，店员，出纳（制药厂）。 */
//        POST(0x4),
        /** 组织机构个人，组织机构的最小元素，指代具体个人。 */
        PERSON(0x8, "person"),
        /** 组织机构角色，角色主要用于横向管理，不是企业或药店的组织，是系统级别的管理，比如：制药方，管理员，终端方。 */
        ROLE(0x20, "role"),
        /** 不能识别的元素类型 */
        UNKNOWN(-1, "unknown");

        private final int code;

        private final String description;

        Element(int code, String description) {
            this.code = code;
            this.description = description;
        }

        public int getCode() {
            return code;
        }

        public String getDescription() {
            return description;
        }

        public static Element of(int code) {
            for (Element element : Element.values()) {
                if (element.getCode() == code) {
                    return element;
                }
            }
            return UNKNOWN;
        }
    }

    /**
     * 组织机构领域事件工具类。组织机构元素之间组合关系发生变化时，则会通过Kafka广播相应变化信息。
     */
    public enum Event {
        /** 新增机构与个人的组合关系，内容格式：{"personId": personId, "orgId": organizationId} */
        ADD_RELATION_ORGANIZATION_PERSON(1),
        /** 删除机构与个人的组合关系，内容格式：{"personId": personId, "orgId": organizationId} */
        DELETE_RELATION_ORGANIZATION_PERSON(2),
        /** 新增角色与个人的组合关系，内容格式：{"roleId": roleId, "personId": personId} */
        ADD_RELATION_ROLE_PERSON(3),
        /** 删除角色与个人的组合关系，内容格式：{"roleId": roleId, "personId": personId} */
        DELETE_RELATION_ROLE_PERSON(4);

        /** 组织机构的业务标识，全局唯一，请参看统一的领域事件消息规范。 */
        public static final int ORG_BUSINESS_ID = 1;

        private final int code;

        Event(int code) {
            this.code = code;
        }

        public int getCode() {
            return code;
        }
    }

    private Organization() {
        // do nothing
    }
}
